package config

import (
	"fmt"
	"os"
	"path/filepath"

	"gopkg.in/yaml.v3"
)

// Config 表示应用程序的配置
type Config struct {
	Output OutputConfig `yaml:"output"`
	WebP   WebPConfig   `yaml:"webp"`
}

// OutputConfig 表示输出目录配置
type OutputConfig struct {
	ImageDir      string `yaml:"image_dir"`
	VideoDir      string `yaml:"video_dir"`
	ConvertToWebP bool   `yaml:"convert_to_webp"`
}

// WebPConfig 表示WebP转换配置
type WebPConfig struct {
	Lossless bool    `yaml:"lossless"`
	Quality  float32 `yaml:"quality"`
}

// DefaultConfig 返回默认配置
func DefaultConfig() *Config {
	return &Config{
		Output: OutputConfig{
			ImageDir:      "./images",
			VideoDir:      "./videos",
			ConvertToWebP: true,
		},
		WebP: WebPConfig{
			Lossless: false,
			Quality:  80,
		},
	}
}

// LoadConfig 从文件加载配置，如果文件不存在则使用默认配置
func LoadConfig(configPath string) (*Config, error) {
	// 检查配置文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		fmt.Printf("配置文件 %s 不存在，使用默认配置\n", configPath)
		return DefaultConfig(), nil
	}

	// 读取配置文件
	data, err := os.ReadFile(configPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	var config Config
	if err := yaml.Unmarshal(data, &config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	// 确保路径是绝对路径
	if !filepath.IsAbs(config.Output.ImageDir) {
		config.Output.ImageDir = filepath.Join(".", config.Output.ImageDir)
	}
	if !filepath.IsAbs(config.Output.VideoDir) {
		config.Output.VideoDir = filepath.Join(".", config.Output.VideoDir)
	}

	return &config, nil
}

// SaveConfig 保存配置到文件
func SaveConfig(config *Config, configPath string) error {
	data, err := yaml.Marshal(config)
	if err != nil {
		return fmt.Errorf("序列化配置失败: %v", err)
	}

	if err := os.WriteFile(configPath, data, 0644); err != nil {
		return fmt.Errorf("写入配置文件失败: %v", err)
	}

	return nil
}
